/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.datamodel.LazySelectedModulo;
import br.jm.financeiro.datamodel.LazyUsuario;
import br.jm.financeiro.entity.Modulo;
import br.jm.financeiro.entity.Usuario;
import br.jm.financeiro.entity.UsuarioModulo;
import br.jm.financeiro.entity.UsuarioModuloPK;
import br.jm.financeiro.filter.Funcoes;
import br.jm.financeiro.sistema.eao.ModuloEao;
import br.jm.financeiro.sistema.eao.UsuarioEao;
import br.jm.financeiro.sistema.eao.UsuarioModuloEao;
import java.io.Serializable;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.primefaces.context.RequestContext;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class UsuarioBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Usuario selectedUsuario;
    private LazyDataModel<Usuario> lazyModel;
    private final UsuarioEao usuarioJpa;
    private Modulo selectedModulo;
    private final ModuloEao moduloJpa;
    private LazySelectedModulo listModulo;
    private Modulo[] selectedModulos;
    private List<Modulo> moduloData;
    private UsuarioModulo selectedUsuarioModulo;
    private UsuarioModuloPK selectedUsuarioModuloPK;
    private final UsuarioModuloEao UsuarioModuloJpa;
    private List<UsuarioModulo> usuarioModuloList;
    private String password1;
    private String password2;
    private boolean disable1;
    private boolean disable2;
    private boolean CheckModulo;
    private FacesMessage msg = null;
    private final Funcoes funcoes = new Funcoes();

    @SuppressWarnings("empty-statement")
    public UsuarioBean() throws EaoException {
        usuarioJpa = UsuarioEao.getInstance();
        selectedUsuario = new Usuario();

        selectedModulo = new Modulo();
        moduloJpa = ModuloEao.getInstance();
        moduloData = moduloJpa.getNative("Modulo", 0, moduloJpa.getCount("Modulo"), null, true, null, null);
        listModulo = new LazySelectedModulo(moduloData);

        selectedUsuarioModulo = new UsuarioModulo();
        selectedUsuarioModuloPK = new UsuarioModuloPK();
        UsuarioModuloJpa = UsuarioModuloEao.getInstance();

        this.disable1 = false;
        this.disable2 = true;

        lazyModel = new LazyUsuario(usuarioJpa);
    }

    public void inserir(ActionEvent actionEvent) throws EaoException {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;
        try {
            if (verifica_campos()) {
                selectedUsuario.setIdUsuario(null);
                selectedUsuario.setDscThema("aristo");
                usuarioJpa.create(selectedUsuario);

                if (selectedUsuario.getTipUsuario().equals("Usuário Normal")) {
                    for (Modulo selectedModulo1 : this.selectedModulos) {
                        this.selectedUsuarioModulo.setModulo(selectedModulo1);
                        this.selectedUsuarioModulo.setUsuario(selectedUsuario);
                        this.selectedUsuarioModuloPK.setIdModulo(selectedModulo1.getIdModulo());
                        this.selectedUsuarioModuloPK.setIdUsuario(this.selectedUsuario.getIdUsuario());
                        this.selectedUsuarioModulo.setUsuarioModuloPK(this.selectedUsuarioModuloPK);
                        UsuarioModuloJpa.create(this.selectedUsuarioModulo);
                    }
                }

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Usuario Inserido com Sucesso: ".concat(selectedUsuario.getNomUsuario())), selectedUsuario.getNomUsuario());
                
                loggedIn = true;
            }

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir" + selectedUsuario.getNomUsuario(),e.getMessage());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
            if (loggedIn) {
                context.update("frmUsuario:panel");
            }
            context.update("frmUsuario:messages");

            context.addCallbackParam("loggedIn", loggedIn);
        }
    }

    public void alterar(ActionEvent actionEvent) throws EaoException {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean loggedIn = false;
        try {
            if (verifica_campos()) {
                if (selectedUsuario.getIdUsuario() == 1) {
                    selectedUsuario.setTipStatus("Ativo");
                    selectedUsuario.setTipUsuario("Administrador");
                }

                if (selectedUsuario.getTipUsuario().equals("Usuário Normal")) {
                    usuarioModuloList = new ArrayList<UsuarioModulo>();

                    for (int i = 0; i < this.selectedModulos.length; i++) {
                        this.selectedUsuarioModuloPK = new UsuarioModuloPK();
                        this.selectedUsuarioModulo = new UsuarioModulo();

                        this.selectedUsuarioModulo.setModulo(this.selectedModulos[i]);
                        this.selectedUsuarioModulo.setUsuario(selectedUsuario);

                        this.selectedUsuarioModuloPK.setIdModulo(this.selectedModulos[i].getIdModulo());
                        this.selectedUsuarioModuloPK.setIdUsuario(this.selectedUsuario.getIdUsuario());

                        this.selectedUsuarioModulo.setUsuarioModuloPK(this.selectedUsuarioModuloPK);

                        usuarioModuloList.add(selectedUsuarioModulo);
                    }

                    selectedUsuario.setUsuarioModuloList(usuarioModuloList);
                }

                usuarioJpa.edit(selectedUsuario);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Usuario Alterado com Sucesso: ".concat(selectedUsuario.getNomUsuario())), selectedUsuario.getNomUsuario());

                loggedIn = true;
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: " + selectedUsuario.getNomUsuario(),
                    e.getMessage());
        } finally {
            mostraButton(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            if (loggedIn) {
                context.update("frmUsuario:panel");
            }
            context.update("frmUsuario:messages");

            context.addCallbackParam("loggedIn", loggedIn);

        }
    }

    public void excluir(ActionEvent actionEvent) throws EaoException {
        try {
            if (selectedUsuario.getIdUsuario() == 1) {
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ATENÇÃO ... Esse Usuário não pode ser Excluido   USUÁRIO MASTER ", selectedUsuario.getNomUsuario());
            } else {
                usuarioJpa.destroy(selectedUsuario);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, LoginBean.AtualizaLog("", "Usuario Excluido com Sucesso: ".concat(selectedUsuario.getNomUsuario())), selectedUsuario.getNomUsuario());
            }
        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: " + selectedUsuario.getNomUsuario(),
                    e.getMessage());
        } finally {
            listModulo = new LazySelectedModulo(moduloData);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public LazyDataModel<Usuario> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Usuario> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Usuario getSelectedUsuario() {
        if (selectedUsuario == null) {
            selectedUsuario = new Usuario();
        }

        return selectedUsuario;
    }

    public void setSelectedUsuario(Usuario selectedUsuario) throws EaoException {
        if (selectedUsuario == null) {
            selectedUsuario = new Usuario();
        }

        this.disable1 = false;
        this.disable2 = true;

        if (selectedUsuario.getTipUsuario().equals("Usuário Normal")) {
            selectedModulos = new Modulo[UsuarioModuloJpa.getCount("UsuarioModulo")];

            for (int i = 0; i < selectedUsuario.getUsuarioModuloList().size(); i++) {
                selectedModulos[i] = selectedUsuario.getUsuarioModuloList().get(i).getModulo();
            }
        }

        this.selectedUsuario = selectedUsuario;
    }

    public Usuario novo() {
        this.selectedUsuario = new Usuario();
        this.selectedUsuario.setIdUsuario(null);
        this.selectedUsuario.setDscEmail("");
        this.selectedUsuario.setNomUsuario("");
        this.selectedUsuario.setTipStatus("Ativo");
        this.selectedUsuario.setTipUsuario("Administrador");

        this.disable1 = true;
        this.disable2 = false;

        return this.selectedUsuario;
    }

    public String getPassword1() {
        return password1;
    }

    public void setPassword1(String password1) {
        this.password1 = password1;
    }

    public String getPassword2() {
        return password2;
    }

    public void setPassword2(String password2) {
        this.password2 = password2;
    }

    public boolean isDisable1() {
        return disable1;
    }

    public void setDisable1(boolean disable1) {
        this.disable1 = disable1;
    }

    public boolean isDisable2() {
        return disable2;
    }

    public void setDisable2(boolean disable2) {
        this.disable2 = disable2;
    }

    public void mostraButton(ActionEvent actionEvent) {
        this.disable1 = false;
        this.disable2 = true;
    }

    public boolean verifica_campos() throws NoSuchAlgorithmException {
        boolean lReturn = true;

        if (selectedUsuario.getNomUsuario().isEmpty()) {
            lReturn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Nome do Usuário em Branco! ", "");
        } else if (selectedUsuario.getUsrName().isEmpty()) {
            lReturn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Login do Usuário em Branco! ", "");
        } else if (password1.isEmpty() || !password1.equals(password2)) {
            lReturn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Senha Incorreta! ", "");
        } else if (selectedUsuario.getTipUsuario().equals("Usuário Normal")) {
            if (this.selectedModulos.length == 0) {
                lReturn = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Nenhum Módulo definido para o Usuário! ", "");
            }
        }

        if (lReturn) {
            selectedUsuario.setUsrPassword(funcoes.criptografaSenha(password1));
        }
        return lReturn;
    }

    public void preparaInserir(ActionEvent actionEvent) {
        this.selectedUsuario = new Usuario();
        this.selectedUsuario.setIdUsuario(null);
        this.selectedUsuario.setDscEmail("");
        this.selectedUsuario.setNomUsuario("");
        this.selectedUsuario.setTipStatus("Ativo");
        this.selectedUsuario.setTipUsuario("Usuário Normal");

        this.disable1 = true;
        this.disable2 = false;
    }

    public Modulo getSelectedModulo() {
        return selectedModulo;
    }

    public void setSelectedModulo(Modulo selectedModulo) {
        this.selectedModulo = selectedModulo;
    }

    public LazySelectedModulo getListModulo() {
        return listModulo;
    }

    public void setListModulo(LazySelectedModulo listModulo) {
        this.listModulo = listModulo;
    }

    public Modulo[] getSelectedModulos() {
        return selectedModulos;
    }

    public void setSelectedModulos(Modulo[] selectedModulos) {
        this.selectedModulos = selectedModulos;
    }

    public List<Modulo> getModuloData() {
        return moduloData;
    }

    public void setModuloData(List<Modulo> moduloData) {
        this.moduloData = moduloData;
    }

    public UsuarioModulo getSelectedUsuarioModulo() {
        return selectedUsuarioModulo;
    }

    public void setSelectedUsuarioModulo(UsuarioModulo selectedUsuarioModulo) {
        this.selectedUsuarioModulo = selectedUsuarioModulo;
    }

    public UsuarioModuloPK getSelectedUsuarioModuloPK() {
        return selectedUsuarioModuloPK;
    }

    public void setSelectedUsuarioModuloPK(UsuarioModuloPK selectedUsuarioModuloPK) {
        this.selectedUsuarioModuloPK = selectedUsuarioModuloPK;
    }

    public boolean isCheckModulo() {
        return CheckModulo;
    }

    public void setCheckModulo(boolean CheckModulo) {
        this.CheckModulo = CheckModulo;
    }
}
